package com.dongqb.win;

import cn.hutool.http.HttpUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class JImagePanel extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private BufferedImage image = null;
	private String errorMessage = null; // 新增：用于显示错误消息
	private boolean refresh=true;
	
	private String imageUrl;
	 // 定时任务调度器
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
        Thread t = new Thread(r);
        t.setDaemon(true); // 设为守护线程，避免阻止 JVM 退出
        t.setName("Image-Refresh-Thread-" + hashCode());
        return t;
    });

    private ScheduledFuture<?> refreshTask;

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (image != null) {
			g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
		} else if (errorMessage != null) { // 如果有错误信息，则显示错误信息
			g.setColor(Color.RED); // 设置字体颜色为红色
			g.drawString(errorMessage, 10, getHeight() / 2); // 显示错误信息
		}
	}

	public void loadImageAsync() {
		SwingWorker<BufferedImage, Void> worker = new SwingWorker<BufferedImage, Void>() {
			@Override
			protected BufferedImage doInBackground() throws IOException {
				// 使用 Hutool 下载图片到临时文件
				byte[] imageData = HttpUtil.downloadBytes(imageUrl); // 直接下载字节数据
				System.out.println(imageData.length);
				InputStream in = new ByteArrayInputStream(imageData);
				return ImageIO.read(in);
			}

			@Override
			protected void done() {
				try {
					image = get();
				} catch (InterruptedException | ExecutionException e) {
					errorMessage = "图片加载失败"; // 设置错误信息
					image = null;
				}
				repaint(); // 加载失败时重新绘制面板以显示错误信息
			}
		};
		worker.execute();
	}
	
	  /**
     * 设置图片 URL 并立即加载一次（可选）
     */
    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
        System.out.println(imageUrl);
    }

    /**
     * 开始定时刷新（每 10 秒一次）
     */
    public void startAutoRefresh() {
        if (refreshTask != null && !refreshTask.isCancelled()) {
            return; // 已经在刷新了
        }

        refresh = true;
        refreshTask = scheduler.scheduleAtFixedRate(() -> {
            if (refresh && imageUrl != null) {
                SwingUtilities.invokeLater(this::loadImageAsync);
            }
        }, 0, 10, TimeUnit.SECONDS); // 首次立即执行，之后每10秒一次
        
        /**
         * 手动触发一次加载（不依赖定时器）
         */
        if (imageUrl != null && refresh) {
            loadImageAsync();
        }
    }

    /**
     * 停止定时刷新
     */
    public void distory() {
        refresh = false;
        if (refreshTask != null) {
            refreshTask.cancel(true);
            refreshTask = null;
        }
        // 可选：关闭 scheduler（通常不需要，除非整个应用要退出）
        // scheduler.shutdown();
    }

    // 可选：在面板被移除时自动停止刷新（Swing 生命周期集成）
    @Override
    public void removeNotify() {
        super.removeNotify();
        distory(); // 自动清理
    }
}